﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Web;
using RESTServices.Dominio;
using System.Data.SqlClient;

namespace RESTServices.Persistencia
{
    public class GastoDAO
    {
        public Gasto Crear(Gasto gastoACrear)
        {
            Gasto gastoCreado = null;
            try
            {

            
            string sql = "INSERT INTO GASTOS VALUES (@cod, @nom, @mon, @est)";
            using (SqlConnection con = new SqlConnection(ConexionUtil.Cadena))
            {
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    com.Parameters.Add(new SqlParameter("@cod", gastoACrear.Codigo));
                    com.Parameters.Add(new SqlParameter("@nom", gastoACrear.Nombre));
                    com.Parameters.Add(new SqlParameter("@mon", (decimal)gastoACrear.monto));
                    com.Parameters.Add(new SqlParameter("@est", "E"));
                    com.ExecuteNonQuery();
                }
            }
            gastoCreado = Obtener(gastoACrear.Codigo);
            }
            catch (Exception ex)
            {

                throw new FaultException<DAOException>(new DAOException(ex));
            }
            return gastoCreado;
        }
        public Gasto Obtener(string codigo)
        {
            Gasto gastoEncontrado = null;
            try
            {
            string sql = "SELECT * FROM GASTOS WHERE codigo=@cod";
            using (SqlConnection con = new SqlConnection(ConexionUtil.Cadena))
            {
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    com.Parameters.Add(new SqlParameter("@cod", codigo));
                    using (SqlDataReader resultado = com.ExecuteReader())
                    {
                        if (resultado.Read())
                        {
                            gastoEncontrado = new Gasto()
                            {
                                Codigo = (string)resultado["codigo"],
                                Nombre = (string)resultado["nombre"],
                                monto = (decimal)resultado["monto"],
                                estado = (string)resultado["estado"]
                            };
                        }
                    }
                }
            }
            }
            catch (Exception ex)
            {

                throw new FaultException<DAOException>(new DAOException(ex));
            }
            return gastoEncontrado;
        }
        public Gasto Modificar(Gasto alumnoAModificar)
        {
            Gasto alumnoModificado = null;
            try
            {
            string sql = "UPDATE GASTOS SET nombre=@nom,estado = @estado WHERE codigo=@cod";
            using (SqlConnection con = new SqlConnection(ConexionUtil.Cadena))
            {
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    com.Parameters.Add(new SqlParameter("@cod", alumnoAModificar.Codigo));
                    com.Parameters.Add(new SqlParameter("@nom", alumnoAModificar.Nombre));
                    com.Parameters.Add(new SqlParameter("@estado", alumnoAModificar.estado));
                    com.ExecuteNonQuery();
                }
            }
            alumnoModificado = Obtener(alumnoAModificar.Codigo);
            }
            catch (Exception ex)
            {

                throw new FaultException<DAOException>(new DAOException(ex));
            }
            return alumnoModificado;
        }

        public void Eliminar(Gasto gastoAEliminar)
        {
            string sql = "DELETE FROM GASTOS WHERE codigo=@cod";
            try
            {
            using (SqlConnection con = new SqlConnection(ConexionUtil.Cadena))
            {
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    com.Parameters.Add(new SqlParameter("@cod", gastoAEliminar.Codigo));
                    com.ExecuteNonQuery();
                }
            }
            }
            catch (Exception ex)
            {

                throw new FaultException<DAOException>(new DAOException(ex));
            }
        }

        public List<Gasto> ListarTodos()
        {
            List<Gasto> gastosEncontrados = new List<Gasto>();
            Gasto gastoEncontrado = null;
            try
            {
            string sql = @"SELECT  [Codigo]
      ,[Nombre]
      ,[Monto]
      ,  case  [Estado]
      when 'E' then 'Creado'
      when 'A' then 'Aceptado'
      when 'R' then 'Rechazado'
      end estado
  FROM [Gastos]";
            using (SqlConnection con = new SqlConnection(ConexionUtil.Cadena))
            {
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    using (SqlDataReader resultado = com.ExecuteReader())
                    {
                        while (resultado.Read())
                        {
                            gastoEncontrado = new Gasto()
                            {
                                Codigo = (string)resultado["codigo"],
                                Nombre = (string)resultado["nombre"],
                                monto = (decimal)resultado["monto"],
                                estado = (string)resultado["estado"]
                            };
                            gastosEncontrados.Add(gastoEncontrado);
                        }
                    }
                }
            }
            }
            catch (Exception ex)
            {

                throw new FaultException<DAOException>(new DAOException(ex));
            }
            return gastosEncontrados;
        }
    }
}